package cl.ccs.migracionbcmc.dao.impl;


import cl.ccs.migracionbcmc.connection.ConnectionFactory;
import cl.ccs.migracionbcmc.dao.ComboBoxDao;
import cl.ccs.migracionbcmc.model.Emisor;
import cl.ccs.migracionbcmc.model.EmisorConsolidado;
import cl.ccs.migracionbcmc.model.IdDescription;
import cl.ccs.migracionbcmc.model.Motivo;
import cl.ccs.migracionbcmc.model.Sucursal;
import cl.ccs.migracionbcmc.model.TipoDocumento;
import cl.ccs.migracionbcmc.model.TipoEmisor;
import cl.ccs.migracionbcmc.util.Constantes;
import cl.ccs.migracionbcmc.util.Constants;
import cl.ccs.migracionbcmc.util.Messages;

import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Types;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

import oracle.jdbc.internal.OracleTypes;


public class ComboBoxDaoImpl implements ComboBoxDao {
    public ComboBoxDaoImpl() {
        super();
    }

    /**
     * @param origen
     * @return
     */
    @Override
    public List<TipoEmisor> getCmbTipoEmisor(int origen) {
        List<TipoEmisor> listTipoEmisor = new ArrayList<TipoEmisor>();
        Connection con = null;
        try {

            con = ConnectionFactory.getConnectionSybaseBIC();
            PreparedStatement stm = null;
            switch (origen) {

            case Constantes.CMB_FIRMAS_EMISOR:
                stm = con.prepareStatement("{CALL SQ_CmbTipoEmisorFIR_ADF}");
                break;
            case Constantes.CMB_NUM_CONFIRM:
                stm = con.prepareStatement("{CALL SQ_CmbTipoEmisorNC_ADF}");
                break;
            case Constantes.CMB_VER_CAR:
                stm = con.prepareStatement("{CALL SQ_CmbTipoEmisor_VsNet}");
                break;
            }

            if (stm == null) {
                return Collections.emptyList();
            }
            ResultSet rs = stm.executeQuery();

            while (rs.next()) {
                TipoEmisor tipoEmisor = new TipoEmisor();
                tipoEmisor.setIdTipoEmisor(rs.getString(1));
                tipoEmisor.setTipoEmisor(rs.getString(2));

                listTipoEmisor.add(tipoEmisor);
            }

        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            ConnectionFactory.freeConnection(con);
        }

        return listTipoEmisor;
    }

    /**
     * @param idTipoEmisor
     * @param origen
     * @return
     */
    @Override
    public List<Emisor> getCmbEmisor(String idTipoEmisor, int origen) {
        List<Emisor> listEmisor = new ArrayList<Emisor>();
        Connection con = null;
        try {

            con = ConnectionFactory.getConnectionSybaseBIC();
            PreparedStatement stm = null;
            switch (origen) {

            case Constantes.CMB_FIRMAS_EMISOR:
                stm = con.prepareStatement("{CALL SQ_CmbEmisorFIR_ADF(?)}");
                break;
            case Constantes.CMB_NUM_CONFIRM:
                stm = con.prepareStatement("{CALL SQ_CmbEmisorNC_ADF(?)}");
                break;
            }

            if (stm == null) {
                return Collections.emptyList();
            }

            stm.setString(1, idTipoEmisor);

            ResultSet rs = stm.executeQuery();

            while (rs.next()) {
                Emisor tipoEmisor = new Emisor();

                tipoEmisor.setCodigoEmisor(rs.getString(2));
                tipoEmisor.setEmisor(rs.getString(3));

                listEmisor.add(tipoEmisor);
            }

        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            ConnectionFactory.freeConnection(con);
        }

        return listEmisor;
    }

    /**
     * @param idTipoEmisor
     * @param codigoEmisor
     * @param origen
     * @return
     */
    @Override
    public List<Sucursal> getCmbSucursal(String idTipoEmisor, String codigoEmisor, int origen) {
        List<Sucursal> listSucursal = new ArrayList<Sucursal>();
        Connection con = null;
        try {
            con = ConnectionFactory.getConnectionSybaseBIC();
            PreparedStatement stm = null;
            switch (origen) {

            case Constantes.CMB_FIRMAS_EMISOR:
                stm = con.prepareStatement("{CALL SQ_CmbSucursalFIR_ADF(?, ?)}");
                break;
            case Constantes.CMB_NUM_CONFIRM:
                stm = con.prepareStatement("{CALL SQ_CmbSucursalNC_ADF(?, ?)}");
                break;
            }

            if (stm == null) {
                return Collections.emptyList();
            }

            stm.setString(1, idTipoEmisor);
            stm.setString(2, codigoEmisor);

            ResultSet rs = stm.executeQuery();

            while (rs.next()) {
                Sucursal sucursal = new Sucursal();
                sucursal.setIdSucursal(rs.getInt(1));
                sucursal.setSucursal(rs.getString(2));

                if (sucursal.getIdSucursal() == 0) {
                    listSucursal.add(0, sucursal);
                } else {
                    listSucursal.add(sucursal);
                }
            }

        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            ConnectionFactory.freeConnection(con);
        }
        return listSucursal;
    }

    /**
     * @return
     */
    @Override
    public List<Motivo> getCmbMotivo() {
        List<Motivo> listMotivo = new ArrayList<Motivo>();
        Connection con = null;
        try {

            con = ConnectionFactory.getConnectionConsulta();
            CallableStatement stm = null;
            stm = con.prepareCall("{CALL SQ_CmbMotivoVerifCar_ADF(?)}");

            stm.registerOutParameter(1, Types.VARCHAR);

            ResultSet rs = stm.executeQuery();

            while (rs.next()) {
                Motivo motivo = new Motivo();
                motivo.setCodigoMotivo(rs.getInt(1));
                motivo.setGlosaMotivo(rs.getString(2));

                listMotivo.add(motivo);
            }

        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            ConnectionFactory.freeConnection(con);
        }

        return listMotivo;
    }

    /**
     * @return
     */
    @Override
    public List<EmisorConsolidado> getCmbEmisorConsol() {
        List<EmisorConsolidado> listEmisorConsolidado = new ArrayList<EmisorConsolidado>();
        Connection conMOL = null;
        try {
            ResultSet rsMOL = null;
            conMOL = ConnectionFactory.getConnectionInfocom();

            CallableStatement stmMOL =
                conMOL.prepareCall("{CALL PKG_VerifCartera.SQ_CmbEmisorConsolidado_ADF(?,?,?)}");
            stmMOL.registerOutParameter(1, Types.NUMERIC); //Retorno
            stmMOL.registerOutParameter(2, Types.VARCHAR); //Mensaje
            stmMOL.registerOutParameter(3, OracleTypes.CURSOR); //Cursor

            stmMOL.execute();

            rsMOL = (ResultSet)stmMOL.getObject(3);

            listEmisorConsolidado = getListEmisorConsolidado(rsMOL);


        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            ConnectionFactory.freeConnection(conMOL);
        }

        return listEmisorConsolidado;
    }

    /**
     * @return
     */
    @Override
    public List<TipoDocumento> getCmbTipoDoc() {
        List<TipoDocumento> listTipoDoc = new ArrayList<TipoDocumento>();
        Connection con = null;
        try {

            con = ConnectionFactory.getConnectionSybaseBIC();
            PreparedStatement stm = null;
            stm = con.prepareStatement("{CALL SQ_CmbTipoDoc_ADF}");

            if (stm == null) {
                return Collections.emptyList();
            }
            ResultSet rs = stm.executeQuery();

            while (rs.next()) {
                TipoDocumento tipoDoc = new TipoDocumento();
                tipoDoc.setTipoDocumento(rs.getString(1));
                tipoDoc.setGlosaTipoDocumento(rs.getString(2));

                listTipoDoc.add(tipoDoc);
            }

        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            ConnectionFactory.freeConnection(con);
        }

        return listTipoDoc;
    }

    /**
     * @param idTipoEmisor
     * @return
     */
    @Override
    public List<Emisor> getCmbEmisoresAll(String idTipoEmisor) {
        List<Emisor> listEmisor = new ArrayList<Emisor>();
        Connection con = null;
        try {
            con = ConnectionFactory.getConnectionSybaseBIC();
            PreparedStatement stm = null;

            stm = con.prepareStatement("{CALL SQ_CmbEmisores_VsNet(?)}");

            stm.setString(1, idTipoEmisor);

            ResultSet rs = stm.executeQuery();

            while (rs.next()) {
                Emisor emisor = new Emisor();
                emisor.setCodigoEmisor(rs.getString(1));
                emisor.setEmisor(rs.getString(2));

                listEmisor.add(emisor);
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            ConnectionFactory.freeConnection(con);
        }
        return listEmisor;
    }


    private List<EmisorConsolidado> getListEmisorConsolidado(ResultSet rs) throws Exception {
        List<EmisorConsolidado> listEmisorConsolidado = new ArrayList<EmisorConsolidado>();

        while (rs.next()) {
            EmisorConsolidado emisorConsolidado = new EmisorConsolidado();

            emisorConsolidado.setCodigoEmisor(rs.getInt(1));
            emisorConsolidado.setRutEmisor(rs.getString(2));
            emisorConsolidado.setGlosaEmisor(rs.getString(3));

            listEmisorConsolidado.add(emisorConsolidado);

        }

        return listEmisorConsolidado;
    }


    @Override
    public List<IdDescription> getCivilStatus() {
        List<IdDescription> list = getList("SQ_CmbEstadoCivil_ADF");
        return list;
    }

    @Override
    public List<IdDescription> getEducationalLevel() {
        List<IdDescription> list = getList("SQ_CmbNivelEducacional_ADF");
        return list;
    }

    @Override
    public List<IdDescription> getGender() {
        List<IdDescription> list = getList("SQ_CmbSexo_ADF");
        return list;
    }

    @Override
    public List<IdDescription> getRegion() {
        List<IdDescription> list = new ArrayList<IdDescription>();
        list.add(new IdDescription(Constants.CMB_DEFAULT_VALUE, Messages.CMB_DEFAULT_MESSAGE));
        list.addAll(getList("SQ_CmbRegion_ADF"));
        return list;
    }

    @Override
    public List<IdDescription> getCommune(int codRegion) {
       
        List<IdDescription> list = new ArrayList<IdDescription>();
        list.add(new IdDescription(Constants.CMB_DEFAULT_VALUE, Messages.CMB_DEFAULT_MESSAGE));
        if ((codRegion + "").equals(Constants.CMB_DEFAULT_VALUE)) {
            return list;
        }
        list = getList("SQ_CmbComuna_ADF", codRegion);
        if (list == null) {
            list = new ArrayList<IdDescription>();
        }
        return list;
    }

    @Override
    public List<IdDescription> getSecurityQuestion() {
        List<IdDescription> list = getList("SQ_CmbPreguntas_ADF");
        return list;
    }

    private List<IdDescription> getList(String sp) {
        IdDescription element;
        List<IdDescription> list = new ArrayList<IdDescription>();
        Connection con = null;
        CallableStatement st = null;
        ResultSet rs = null;
        try {
            con = getConnectionSyBase();
            st = con.prepareCall("{? = call " + sp + "}");
            st.registerOutParameter(1, Types.INTEGER);

            rs = st.executeQuery();

            if ((null != rs)) {
                while (rs.next()) {
                    element = new IdDescription(rs.getString(1), rs.getString(2));
                    list.add(element);
                }
            }
        } catch (Exception e) {
            handleException(e);
            list.clear();
        } finally {
            ConnectionFactory.freeConnection(con, st, rs);
        }
        return list;
    }

    private List<IdDescription> getList(String sp, int cod) {
        IdDescription element;
        List<IdDescription> list = new ArrayList<IdDescription>();
        Connection con = null;
        CallableStatement st = null;
        ResultSet rs = null;
        try {
            con = getConnectionSyBase();
            st = con.prepareCall("{? = call " + sp + " (?)}");
            st.registerOutParameter(1, Types.INTEGER);
            st.setInt(2, cod);
            rs = st.executeQuery();

            if ((null != rs)) {
                while (rs.next()) {
                    element = new IdDescription(rs.getString(1), rs.getString(2));
                    list.add(element);
                }
            }
        } catch (Exception e) {
            handleException(e);
            list.clear();
        } finally {
            ConnectionFactory.freeConnection(con, st, rs);
        }
        return list;
    }

    private void handleException(Exception e) {
        e.printStackTrace();
    }

    private Connection getConnectionSyBase() throws Exception {
        return ConnectionFactory.getConnectionSybaseBIC();
    }

    @Override
    public List<IdDescription> getCmbEstadoClienteAll() {
        IdDescription dato = new IdDescription("0", "TODOS");

        dato.setId("0");
        dato.setDescription("TODOS");

        List<IdDescription> list = getList("SQ_CmbEstadoCliente_ADF");
        list.add(0, dato);
        return list;
    }

    @Override
    public List<IdDescription> getCmbCCostoAll() {
       // IdDescription dato = new IdDescription("0", "TODOS");
        
        //dato.setId("0");
        //dato.setDescription("TODOS");
        List<IdDescription> list = new ArrayList<IdDescription>();
        //list.add(new IdDescription("0", "TODOS"));        
        list.addAll(getList("SQ_CmbCCosto_ADF"));
       
        return list;
    }
}
